package net.zoneland.knowledge.service;

import net.zoneland.knowledge.enums.AttachTypeEnum;
import net.zoneland.knowledge.enums.WorkStatusEnum;
import net.zoneland.knowledge.exceptions.WorkApplyException;
import net.zoneland.knowledge.model.*;
import net.zoneland.knowledge.service.bean.SelectUser;
import net.zoneland.knowledge.service.bean.WorkApplyQueryVO;
import net.zoneland.uniflow.client.UserInfo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 智办工单业务接口.
 * @author zmq
 * @Date 2022/8/9 11:13
 */
public interface WorkApplyInfoService {
    /**
     * 任务id为空提示语.
     */
    public static final String TASK_ID_BLANK_ERROR_MSG = "任务id不能为空！";

    /**
     * 保存草稿.
     * @param workApplyInfo 工单信息
     * @param user 当前用户
     * @param request 请求信息
     * @param saveType 保存类型（草稿、复制）
     * @throws WorkApplyException 任务工单操作异常
     */
    void saveDraft(final WorkApplyInfo workApplyInfo, final LoginUserPojo user, final HttpServletRequest request, final String saveType) throws WorkApplyException;

    /**
     * 查询工单信息.
     * @param id 工单id
     * @return 工单信息
     */
    WorkApplyInfo findWorkApplyInfoById(String id) throws WorkApplyException;

    /**
     * 查询工单信息.
     * 需要查询主工单信息
     * @param id 工单id
     * @return 工单信息
     */
    WorkApplyInfo findWorkApplyInfoByIdWithMainApply(String id) throws WorkApplyException;

    /**
     * 提交工单.
     * @param taskId 任务id
     * @param workApplyInfo 工单信息
     * @param status 状态
     * @param opinion 意见
     * @param user 当前用户
     * @throws WorkApplyException 异常
     */
    void submit(String taskId, WorkApplyInfo workApplyInfo, WorkStatusEnum status, String opinion, LoginUserPojo user) throws WorkApplyException;

    /**
     * 查询参数对象.
     * @param vo 查询参数对象
     * @return 查询结果
     */
    List<WorkApplyInfo> queryWorkApply(WorkApplyQueryVO vo);

    /**
     * 提交草稿工单.
     * @param info 工单信息
     * @param taskId 任务id
     * @param opinion 意见
     * @param user 当前用户
     * @param operatorType 操作类型
     * @param request
     */
    void submitDraft(final WorkApplyInfo info, final String taskId, final String opinion, final LoginUserPojo user, final HttpServletRequest request, final String operatorType);

    /**
     * 退回任务.
     * @param workApplyId 工单信息
     * @param taskId 任务信息id
     * @param rejectReason 退回原因
     * @param user 操作用户
     */
    void rejectTask(String workApplyId, String taskId, String rejectReason, LoginUserPojo user);

    /**
     * 分任务子流程-组织人员处理上报.
     * @param info 工单信息
     * @param taskId 任务信息
     * @param user 用户
     * @param opinion 操作意见
     * @param request
     */
    void report(WorkApplyInfo info, String taskId, LoginUserPojo user, String opinion, HttpServletRequest request);

    /**
     * 分任务子流程-组织人员处理分派.
     * @param info 工单信息
     * @param taskId 任务id
     * @param user 用户
     * @param opinion 操作意见
     */
    void dispatch(WorkApplyInfo info, String taskId, LoginUserPojo user, String opinion);

    /**
     * 责任人确认环节确认提交.
     * @param taskId 任务id
     * @param info 工单信息
     * @param opinion 意见
     * @param user 操作用户
     * @param request
     */
    void responderApprove(String taskId, WorkApplyInfo info, String opinion, LoginUserPojo user, HttpServletRequest request);

    /**
     * 责任人确认/子流程拟稿人确认退回.
     * @param info 工单信息
     * @param taskId 任务id
     * @param opinion 意见
     * @param user 操作用户
     */
    void rejectOrgHandler(WorkApplyInfo info, String taskId, String opinion, LoginUserPojo user);

    /**
     * 分任务子流程组织人员确认环节确认.
     * @param info 工单信息
     * @param taskId 任务id
     * @param user 操作用户
     * @param opinion 意见
     * @param request
     */
    void subOrgUserConfirm(WorkApplyInfo info, String taskId, LoginUserPojo user, String opinion, HttpServletRequest request);

    /**
     * 通过父工单id查询子工单信息.
     * @param parentId 父工单id
     * @return 工单信息
     */
    List<WorkApplyInfo> findWorkApplyByParentId(String parentId);

    /**
     * 责任人确认/子流程拟稿人确认单个退回.
     * @param info 工单信息
     * @param taskId 任务id
     * @param subApplyId 子工单id
     * @param opinion 意见
     * @param user 操作用户
     */
    void rejectSimpleOrgHandler(WorkApplyInfo info, String taskId, String subApplyId, String opinion, LoginUserPojo user);
    /**
     * 责任人确认、组织人员办理环节确认提交.
     * @param taskId 任务id
     * @param info 工单信息
     * @param subApplyId 子工单id
     * @param opinion 意见
     * @param user 操作用户
     * @param request
     */
    void confirmSimpleTask(String taskId, WorkApplyInfo info, String subApplyId, String opinion, LoginUserPojo user, HttpServletRequest request);

    /**
     * 查询指定用户下所有待办分任务.
     * @param handlerId 用户id
     * @return 该用户名下智办工单集合
     */
    List<WorkSubTaskInfo> findWorkSubTasksByUserId(final String handlerId);

    /**
     * 查询指定id的所有分任务.
     * @param idList 分任务id列表
     * @return 所有满足条件的分任务列表
     */
    List<WorkSubTaskInfo> findWorkSubTasksByIds(final List<String> idList);

    WorkApplyInfoAttachment findWorkAttachmentById(String attachmentId);

    List<WorkApplyInfoAttachment> findWorkApplyInfoAttachmentsByApplyIds(final List<String> workApplyIds, final AttachTypeEnum type);

    /**
     * 解析人员
     * @param orgUserSelectItems 选人框结果
     * @return 人员对象
     */
    List<List<PartyUserVo>> getResolveReceiver(List<PartyOrgUserSelectItem> orgUserSelectItems);

    /**
     * 验证选人框参数.
     *   检查党组织是否有干事
     *   检查人员是否重复
     *   检查人员是否有oa账号
     * @param orgUserSelectItems 选人框结果
     * @param users 解析后人员
     * @return 检证结果信息，非空：验证失败
     */
    String checkReceiver(List<PartyOrgUserSelectItem> orgUserSelectItems, List<List<PartyUserVo>> users);

    /**
     * 办结确认。
     * @param workApplyInfo 要办结确认的工单对象
     * @param opinion 处理意见
     * @param user 当前处理人
     */
    void finishConfirm(WorkApplyInfo workApplyInfo, String opinion, LoginUserPojo user);


    /**
     * 查询我的已办.
     * @param param 查询参数
     * @return
     */
    List<WorkApplyInfo> queryDoneTask(WorkApplyQueryVO param);

    /**
     * 查询我的阅办列表.
     * @param param 查询参数
     * @return
     */
    List<WorkApplyInfo> queryReadTask(WorkApplyQueryVO param);

    /**
     * 更新工单通知方式.
     * @param id 工单id
     * @param notifyMethod 通知方式
     */
    void updateNotifyMethod(String id, boolean notifyMethod);

    /**
     * 结报.
     * 起草人可以提前终止流程：
     *    需要递归查询所有工单信息，需要异步处理
     *    处理流程平台待办
     *    需要更新工单及分任务状态，及handler信息
     *    需要记录已办记录
     */
    void terminateApply(String workApplyId, LoginUserPojo user);

    /**
     * 删除草稿.
     * @param workApplyId 工单id
     * @param user 当前用户
     */
    void deleteDraft(String workApplyId, LoginUserPojo user);

    /**
     * 变更工单阅办状态
     * @param workApplyId 工单id
     * @param user 用户信息
     */
    void updateReadType(final String workApplyId, final LoginUserPojo user);


    /**
     * 上传WPS共享编辑附件
     * @param workApplyInfo 主工单信息对象
     */
    void uploadSharedEditingAttachment(final WorkApplyInfo workApplyInfo);

    /**
     * 转交工单.
     * @param taskId 任务id
     * @param info 工单信息
     * @param opinion 意见
     * @param user 当前用户
     * @param transferUser 转交人
     * @throws WorkApplyException 智办工单处理异常
     */
    void transfer(final String taskId, final WorkApplyInfo info, final String opinion, final LoginUserPojo user, final SelectUser transferUser) throws WorkApplyException;

}
